﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sio.Mdm.Entities;
using Sio.Mdm.BF.Ldap;
using Sio.Mdm.Types.Database;
using Sio.Mdm.Types;

namespace Sio.Mdm.BL.Ldap
{
    /// <summary>
    /// 
    /// 
    /// </summary>
    class SkupineProvider
    {
        bool _skupineIsLoaded = false;
        int _orgarnizacijaID = 0;
        EntityCollection<LdapSkupinaStoritev> _skupine = null;
        Dictionary<int, Dictionary<int, List<int>> > _streznikiSkupine = null;
        Dictionary<int, string> _skupineStoritve = null;

        #region Properties
        public bool SkupineIsLoaded
        {
            get {
                return _skupineIsLoaded;
            }
        }

        public int OrgarnizacijaID
        {
            get {
                return _orgarnizacijaID;
            }
        }
        #endregion

        #region Public
        public SkupineProvider()
        {

        }

        public SkupineProvider(int OrgarnizacijaID)
        {
            _orgarnizacijaID = OrgarnizacijaID;
        }

        public Result LoadSkupine()
        {
            try
            {
                // (1) Get all groups (of type LDAP/AD Group)
                _skupine = new EntityCollection<LdapSkupinaStoritev>(
                    new Filter<LdapSkupinaStoritev>().Where(r => r.OrgarnizacijaID == OrgarnizacijaID && 
                        (r.TipStoritveID==0 || r.TipStoritveID==1)));

                //(2) Foreach get memebers
                _streznikiSkupine = new Dictionary<int,Dictionary<int,List<int>>>();
                _skupineStoritve = new Dictionary<int, string>();
                foreach (LdapSkupinaStoritev skupina in _skupine)
                { 
                    int CurrentStreznikID = skupina.StoritevKljuc;

                    EntityCollection<SkupinaEntitete> clani = new EntityCollection<SkupinaEntitete>(new Filter<SkupinaEntitete>(skupina.SkupinaID));
                    if (clani.Count>0)
                    {                        
                        List<int> claniList = new List<int>();
                        foreach (SkupinaEntitete clan in clani)
                        {
                            claniList.Add(clan.IdmStevilka);
                        }

                        if (_streznikiSkupine.ContainsKey(CurrentStreznikID))
                        {
                            Dictionary<int, List<int>> skupinaClani = _streznikiSkupine[CurrentStreznikID];
                            skupinaClani.Add(skupina.SkupinaID, claniList);
                            _skupineStoritve.Add(skupina.SkupinaID, skupina.StoritevParam);
                        }
                        else {
                            Dictionary<int, List<int>> skupinaClani = new Dictionary<int, List<int>>();
                            skupinaClani.Add(skupina.SkupinaID, claniList);
                            _streznikiSkupine.Add(CurrentStreznikID, skupinaClani);
                            _skupineStoritve.Add(skupina.SkupinaID, skupina.StoritevParam);
                        }
                    }                    
                }
                _skupineIsLoaded = true;
            }
            catch (Exception ex)
            {
                return new Result(String.Format("Error while loading skupine for OrgarnizacijaID={0}.",OrgarnizacijaID), ex);
            }

            return null;
        }
        
        public List<string> GetClanSkupine(int streznikID, int idmStevilka)
        {
            List<string> clanSkupine = new List<string>();

            if (_streznikiSkupine.ContainsKey(streznikID))
            {
                Dictionary<int, List<int>> skupine = _streznikiSkupine[streznikID];

                foreach (int skupina in skupine.Keys)
                {
                    List<int> clani = skupine[skupina];

                    if (clani.Contains(idmStevilka)) {
                        clanSkupine.Add(_skupineStoritve[skupina]);        
                    }
                }
            }

            return clanSkupine;
        }
        #endregion

        #region Private

        #endregion
    }
}
